/**
 * 给定一个树，再给定候选点集，问包含这些点的最小树有多少个点
 * 令Di为i子树包含候选点集的最小边数
 * 令v是i的儿子，则
 * Di += 1 + Dv, 当Dv不为0时
 * Di += 1, 当v在候选点集中
 * 最后答案是D[root] + 1
 */
#include <bits/stdc++.h>
#include <bits/extc++.h>
using namespace std;

using llt = long long;
using vi = vector<int>;
using vll = vector<llt>;
using pii = pair<int, int>;
using pll = pair<llt, llt>;

int K;
int N;
vector<vi> G;
set<int> Set;
int Root;
vi D;

void dfs(int u, int p){
    for(auto v : G[u]){
        if(v == p) continue;

        dfs(v, u);
        if(D[v]) D[u] += 1 + D[v];
        else if(Set.find(v) != Set.end()) D[u] += 1;
    }
    return;
}

void work(){
    cin >> N >> K;
    G.assign(N + 1, {});
    for(int a,b,i=1;i<N;++i){
        cin >> a >> b;
        G[a].push_back(b);
        G[b].push_back(a);
    }

    cin >> Root; 
    for(int i=1;i<K;++i){
        int x; cin >> x;
        Set.insert(x);
    }

    D.assign(N + 1, 0);
    dfs(Root, 0);
    cout << D[Root] + 1 << endl;
    return; 
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);	
    int nofkase = 1;
	// cin >> nofkase;
	while(nofkase--) work();
	return 0;
}